#include <gtest/gtest.h>
#include "type_traits.h"

// 测试m_integral_constant
TEST(TypeTraitsTest, IntegralConstant)
{
    using Zero = my_stl::m_integral_constant<int, 0>;
    using One = my_stl::m_integral_constant<int, 1>;

    EXPECT_EQ(Zero::value, 0);
    EXPECT_EQ(One::value, 1);
}

// 测试m_bool_constant
TEST(TypeTraitsTest, BoolConstant)
{
    using TrueType = my_stl::m_bool_constant<true>;
    using FalseType = my_stl::m_bool_constant<false>;

    EXPECT_TRUE(TrueType::value);
    EXPECT_FALSE(FalseType::value);
}

// 测试m_true_type和m_false_type
TEST(TypeTraitsTest, TrueAndFalseTypes)
{
    EXPECT_TRUE(my_stl::m_true_type::value);
    EXPECT_FALSE(my_stl::m_false_type::value);
}

// 测试is_pair
TEST(TypeTraitsTest, IsPair)
{
    // 非pair类型测试
    EXPECT_FALSE((my_stl::is_pair<int>::value));
    EXPECT_FALSE((my_stl::is_pair<double>::value));

    // pair类型测试
    EXPECT_TRUE((my_stl::is_pair<my_stl::pair<int, int>>::value));
    EXPECT_TRUE((my_stl::is_pair<my_stl::pair<int, double>>::value));

    // const/volatile测试
    // EXPECT_TRUE((my_stl::is_pair<const my_stl::pair<int, int>>::value));
    // EXPECT_TRUE((my_stl::is_pair<volatile my_stl::pair<int, int>>::value));
}